package netty.io.demo.Netty.udp.unicast;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;

import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;

/**
 * 发送端
 *
 * @author lihh
 */
public class UdpQuestionSide {
  
  public final static String QUESTION = "告诉我一句古诗";
  
  public void run(int port) throws InterruptedException {
    // 线程群组
    NioEventLoopGroup group = new NioEventLoopGroup();
    
    try {
      // client
      Bootstrap b = new Bootstrap();
      b.group(group)
          // 通过此 api 【NioDatagramChannel】 可以设置 udp的发送方式
          .channel(NioDatagramChannel.class)
          .handler(new QuestionHandler());
      
      // 不需要建立 连接, local 不需要绑定端口
      Channel ch = b.bind(0).sync().channel();
      // 将UDP请求的报文以DatagramPacket打包发送给接受端
      ch.writeAndFlush(
          new DatagramPacket(
              Unpooled.copiedBuffer(
                  QUESTION, StandardCharsets.UTF_8
              ),
              // 这里是 点对点的 单播形式，点对点发送
              new InetSocketAddress("127.0.0.1", port)
          )
      ).sync();
      
      // 不知道接收端能否收到报文，也不知道能否收到接收端的应答报文
      // 所以等待15秒后，不再等待，关闭通信
      if (!ch.closeFuture().await(15000)) {
        System.out.println("查询超时.");
      }
    } finally {
      // 执行到此处 进行优雅的关闭
      group.shutdownGracefully().sync();
    }
  }
  
  public static void main(String[] args) throws InterruptedException {
    // 发送 udp socket 请求
    new UdpQuestionSide().run(10030);
  }
}
